package protocolo;

import java.net.DatagramPacket;

public class Pedido {
	public enum TipoPedido {
		HELPME, ACCEPTED, ICAN, IMBUSY;
	}
	
	public enum TipoTarea {
		ATACAR, DEFENDER, CONQUISTAR, NINGUNA;
	}
	
	private TipoPedido tipo;
	private TipoTarea tarea;
	private int idObjetivo;
	private String pedidoIP;
	private int pedidoPuerto;
	
	
	public Pedido() {
		
	}
	
	public Pedido(TipoPedido tipo, TipoTarea tarea, int idObjetivo, String pedidoIP, int puerto) {
		this.tipo = tipo;
		this.tarea = tarea;
		this.idObjetivo = idObjetivo;
		this.pedidoIP = pedidoIP;
		this.pedidoPuerto = puerto;
	}
	
	
	public boolean esAyuda() {
		return (tipo == TipoPedido.HELPME);
	}
	
	public boolean esAccepted() {
		return (tipo == TipoPedido.ACCEPTED);
	}
	
	public boolean esIcan() {
		return (tipo == TipoPedido.ICAN);
	}
	
	public boolean esImBusy() {
		return (tipo == TipoPedido.IMBUSY);
	}
	
	
	
	
	public boolean esAtacar() {
		return (tarea == TipoTarea.ATACAR);
	}
	
	public boolean esDefender() {
		return (tarea == TipoTarea.DEFENDER);
	}
	
	public boolean esConquistar() {
		return (tarea == TipoTarea.CONQUISTAR);
	}
	
	
	public int getIdObjetivo() {
		return idObjetivo;
	}
	
	
	public String getDireccionIP() {
		return pedidoIP;
	}
	
	public int getPuerto() {
		return pedidoPuerto;
	}
	
	
	public void setTipo(TipoPedido tipo) {
		this.tipo = tipo;
	}
	
	public void setIP(String ip) {
		this.pedidoIP = ip;
	}
	
	
	public byte[] getByte() {
		byte[] b = new byte[1];
		
		int bTipo = tipo.ordinal();
		int bTarea = tarea.ordinal() << 2;
		int bObjetivo = idObjetivo << 4;
		
		b[0] = (byte)(bObjetivo | bTarea | bTipo);
		return b;
	}
	
	public Pedido obtenerPedido(DatagramPacket pack) {
		String direccionPedido = pack.getAddress().toString();
		int puertoPedido = pack.getPort();
		TipoTarea tarea;
		TipoPedido tipo;
		int idObjetivo;
		
		byte[] bytePedido = pack.getData();
		if (bytePedido.length == 0)
			System.err.println("No hay datos en el paquete");
		if (bytePedido.length > 1)
			System.err.println("Se esperaba solo un byte en el pedido");
		                           
		switch (bytePedido[0]) {
			case 1:
				tipo = TipoPedido.ICAN;
				tarea = TipoTarea.NINGUNA;
				idObjetivo = 0;
				break;
			case 2:
				tipo = TipoPedido.IMBUSY;
				tarea = TipoTarea.NINGUNA;
				idObjetivo = 0;
				break;
			case 3:
				tipo = TipoPedido.ACCEPTED;
				tarea = TipoTarea.NINGUNA;
				idObjetivo = 0;
				break;
			default:
				byte mascaraTarea = new Byte("00001100");
				byte mascaraIdObjetivo = new Byte("01110000");
				
				tipo = TipoPedido.HELPME;
				tarea = TipoTarea.NINGUNA;
				if ((bytePedido[0] & mascaraTarea) == 0) {
					tarea = TipoTarea.ATACAR;
				} else if ((bytePedido[0] & mascaraTarea) == 4) {
					tarea = TipoTarea.DEFENDER;
				} else if ((bytePedido[0] & mascaraTarea) == 8) {
					tarea = TipoTarea.CONQUISTAR;
				} else {
					System.err.println("Error: El tipo de Tarea de ayuda no es correcto");
				}
				idObjetivo =  (bytePedido[0] & mascaraIdObjetivo) << 16;
				
				break;				
		}
		
		return new Pedido(tipo, tarea, idObjetivo, direccionPedido, puertoPedido);
	}
}
